Enable tile-row based multi-threading in Encoder
Multi-threading scaling of encoder ~ 2.9x for 4 threads (parkrun_720p50,
with 2 tile-columns and 2 tile-rows).
Change-Id: I6834bdb723e0d376409120023acae69d8dcdf69f
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 27ca537..ba44cda 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4943,11 +4943,7 @@
av1_inter_mode_data_init();
#endif
- // If allowed, encoding tiles in parallel with one thread handling one tile.
- // TODO(geza.lore): The multi-threaded encoder is not safe with more than
- // 1 tile rows, as it uses the single above_context et al arrays from
- // cpi->common
- if (AOMMIN(cpi->oxcf.max_threads, cm->tile_cols) > 1 && cm->tile_rows == 1)
+ if (AOMMIN(cpi->oxcf.max_threads, cm->tile_cols * cm->tile_rows) > 1)
av1_encode_tiles_mt(cpi);
else
encode_tiles(cpi);
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 637d682..6d9c8a8 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -50,8 +50,9 @@
void av1_encode_tiles_mt(AV1_COMP *cpi) {
AV1_COMMON *const cm = &cpi->common;
const int tile_cols = cm->tile_cols;
+ const int tile_rows = cm->tile_rows;
const AVxWorkerInterface *const winterface = aom_get_worker_interface();
- int num_workers = AOMMIN(cpi->oxcf.max_threads, tile_cols);
+ int num_workers = AOMMIN(cpi->oxcf.max_threads, tile_cols * tile_rows);
int i;
av1_init_tile_data(cpi);